ASP NET - Data e Horario

Porque a data é um item tão complicado ?

A data dentro de cada sistema (web, sql, etc.) tem um formato binário interno e, nem sempre, o mesmo em todos os sistemas. Por esse motivo ocorre uma 'conversão' que é problemática porque depende de como a data é interpretada por cada sistema.

Além dos problemas internos do armazenamento de data existe os externos como o idioma, a necessidade que temos de utilizar as partes da data e horário (dia/mes/ano), os aplicativos utilizados para interagir com o servidor que utilizam formatos específicos, etc.

Outra questão são as operações com datas : Muitas vezes precisamos fazer operações com data como quantos dias se passaram de uma data até outra ou dias entre duas datas, data futura, etc.

Mesmo nas aplicações do dia-a-dia temos diferenças com a data. Por exemplo, para bancos o ano tem 360 dias divididos em 12 meses de 30 dias. Este tipo de definição é chamado de 'comercial', mais específicamente, 'mês comercial', 'ano comercial', etc.

Já nós também temos algumas complicações...se o ano é normal ou bissexto, dependendo do mês temos um determinado número de dias, feriados, feriados facultativos, etc.

Outra conversão é onde estamos exibindo...numa aplicação web, numa aplicação desktop onde quem interpreta a data são 'mecanismos' diferentes, um é o windows/linux e outro é o browser.

Tem outro detalhe que o formato do horário quando queremos o relógio com 12 ou 24 horas. Infelizmente sempre que usarmos o relógio de 12 horas teremos associado ao horário a sigla 'AM' (Ante Meridiem') ou 'PM' (Post Meridiem) que é uma sigla em Latim que todos temos dificuldade em entender porque temos que pensar 'AM' é antes ou depois do meio-dia.

Limitações

Se você quiser um tipo de variável que trabalhe apenas com tempo ou horario ( sem a data ) você não vai encontrar no .NET. Existe um tipo chamado TimeSpan que é um número inteiro que apenas conta centésimos de segundos a partir de uma data padrão, contudo não define HH:MM:SS...se você precisa dessa informação precisará fazer contas com o tipo inteiro dessa variável.

Funções de Data e Horário no .NET

        ' data e tempo

        Dim MinhaDatax As Date = #1/1/2013#
        Dim MinhaData As DateTime = DateTime.Now
        MinhaData = MinhaData.AddDays(100)
        Dim StringDate As String = MinhaData.Year.ToString()

        Dim MinhaData1 As Date = DateTime.Now
        Dim MinhaData2 As Date = DateTime.Now.AddHours(3000)
        Dim Diferenca1 As TimeSpan
        Diferenca1 = MinhaData2.Subtract(MinhaData1)
        Dim NumberOfMinutes As Double
        NumberOfMinutes = Diferenca1.TotalMinutes

        Dim MinhaData3 As DateTime = DateTime.Now
        Dim Intervalo As TimeSpan = TimeSpan.FromHours(3000)
        Dim MinhaData4 As DateTime = MinhaData1 + Intervalo

        ' Subtraindo um objeto DateTime de outro produz um TimeSpan.
        Dim Diferenca As TimeSpan
        Diferenca = MinhaData2 - MinhaData1

        Dim MinhaData5 As Date = DateTime.Today
        Dim MeuInteiro6 As Integer = Now.Day
        Dim MeuInteiro7 As Integer = Now.Month
        Dim MeuInteiro8 As Integer = Now.Year
        Dim MeuInteiro9 As Integer = Now.Hour
        Dim MeuInteiro10 As Integer = Now.Hour
        Dim MeuInteiro11 As Integer = Now.Minute
        Dim MeuInteiro12 As Integer = Now.Second
        Dim MeuInteiro13 As Integer = Now.Millisecond
        Dim MeuInteiro14 As Integer = Now.DayOfWeek

        Dim MinhaData15 As Date = DateTime.Now.AddDays(3000)
        Dim MinhaData16 As Date = DateTime.Now.AddMonths(300)
        Dim MinhaData17 As Date = DateTime.Now.AddYears(3)
        Dim MinhaData18 As Date = DateTime.Now.AddHours(3000)
        Dim MinhaData19 As Date = DateTime.Now.AddMinutes(3000)
        Dim MinhaData20 As Date = DateTime.Now.AddSeconds(3000)

        Dim MeuInteiro15 As Integer = DateTime.DaysInMonth(2003, 2)

        Dim MeuInteiro16 As Boolean = DateTime.IsLeapYear(2003)

        Dim dt As DateTime = New DateTime(2010, 10, 17)
        Dim dia As Integer = dt.DayOfWeek
        Dim diasem As Integer = dt.DayOfWeek
        Dim horarioVerao As Boolean = dt.IsDaylightSavingTime
        Dim bissexto As Boolean = Date.IsLeapYear(2013)

        Dim ts As TimeSpan = New TimeSpan(4, 30, 22)      ' 4 horas 30 minutos e 22 segundos
        ts = ts.Subtract(New TimeSpan(0, 15, 0))            ' retirando 15 minutos = 4h15min22seg

Formatação de data

Existe a função format que permite formatar a data em um padrão dependendo do parâmetro que fornecemos.

Exemplo. Vamos utilizar uma data qualquer e observar como ela é formatada depdendo do parâmetro da Função Format.
        Dim data1 As String = 19 de Setembro de 1980 14:30:59)

O formato geral é o seguinte :
        Dim fmtData As String = String.Format("d", data1)

Note que no exemplo "d" é o parâmetro especificador qude define o formato que desejamos.


Especificador Tipo Formato
d Data(curta) 19/09/1980
D Data long 19  Setembro(1980)
t Hora(Curta) 14:30
T Hora(Longa) 14:30:59
f Data e Hora 19 Setembro 1980 14:30
F Data e Hora completo 19 Setembro 1980 14:30:59
g Data de Hora padrão 19/09/1980 14:30
G Data de Hora padrão longo 19/09/1980 14:30:59
M Dia / Mês 19 Setembro(1980)
r String de data (RFC1123) Sex, 19 Set 1980 14:30:59 GMT
s Sortable(Data / hora) 1980-09-19T14:30:59
u Hora Universal, Timezone local 1980-09-19 14:30:59Z
Y Mês / Ano Setembro(1980)
dd dia 19
ddd Nome curto do dia da Semana Sex
dddd Nome completo do dia da Semana Sexta(-feira)
hh 2 dígitos para a hora 02
HH 2 dígitos para a hora (24 horas) 14
mm 2 dígitos para o minuto 30
MM Mês 9
MMM Nome curto do Mês Set
MMMM Nome do Mês Setembro
ss Segundos() 59
tt AM/PM PM()
yy 2 dígitos do Ano 80
yyyy 4 dígitos do Ano 1980
: Separador de horário. ex. {0:hh:mm:ss} 14:30:59
/ Seperator de data, ex. {0:dd/MM/yyyy} 08/06/1970